package org.facyt.vacas.daos.impl;

import java.math.BigDecimal;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.facyt.commons.util.StringUtils;
import org.facyt.vacas.daos.ComponenteDAO;
import org.facyt.vacas.entities.vacas.Componente;
import org.facyt.vacas.entities.vacas.Unidad;
import org.springframework.stereotype.Repository;

@Repository
public class ComponenteDAOImpl implements ComponenteDAO {

	private static final Log logger = LogFactory.getLog(ComponenteDAOImpl.class);
	
	@PersistenceContext
	private EntityManager entityManager;


	public EntityManager getEntityManager() {
		return entityManager;
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	
	public Componente getComponenteById(Integer id) throws Exception {
		
		Componente resultado = null;
		StringBuilder queryString = new StringBuilder();

		queryString.append("FROM Componente c where ");
		queryString.append("c.id = :codigo ");

		try {
			// se crea la cuery
			Query query = this.entityManager
					.createQuery(queryString.toString());

			query.setParameter("codigo", id);

			@SuppressWarnings("unchecked")
			List<Componente> lista = (List<Componente>) query
					.getResultList();

			if (!lista.isEmpty())
				resultado = lista.get(0);

			

		} catch (Exception e) {
			logger.error("",e);
			throw e;
		}

		return resultado;
	}

	@SuppressWarnings("unchecked")
	
	public List<Componente> getAllComponente() {
		List<Componente> lista = null;
		StringBuilder queryString = new StringBuilder();

		//Si el id del grupo que viene como parametro es Facyt, se deben mostrar TODAS las mp. de la base
		// buscar las materias primas del usuario 1 Facyt mas las del usuarios idusuario.
		queryString.append("FROM Componente componente");	
			

		try {
			// se crea la cuery
			Query query = this.entityManager
					.createQuery(queryString.toString());		
					
			lista = (List<Componente>) query.getResultList();			
						
		} catch (Exception e) {
			logger.error("", e);
			return null;
		}

		return lista;
	}
	@SuppressWarnings("unchecked")
	
	public List<Componente> getDiferentesComponente(long idmp) {
		List<Componente> lista = null;
		StringBuilder queryString = new StringBuilder();

		//Si el id del grupo que viene como parametro es Facyt, se deben mostrar TODAS las mp. de la base
		// buscar las materias primas del usuario 1 Facyt mas las del usuarios idusuario.
		queryString.append("select id FROM Componente id where not in (select" +
				" fk_componente from composicion_mp where fk_materia_prima = :idmp");	
			

		try {
			// se crea la cuery
			Query query = this.entityManager
					.createQuery(queryString.toString());		
					
			lista = (List<Componente>) query.getResultList();			
						
		} catch (Exception e) {
			logger.error("", e);
			return null;
		}

		return lista;
	}
	
//	public boolean esCloro(Componente componente) {
//		return (componente.getDescripcion().indexOf(Constantes.Componentes.CLORO)>=0);
//	}
//
//	
//	public boolean esAzufre(Componente componente) {
//		return (componente.getDescripcion().indexOf(Constantes.Componentes.AZUFRE)>=0);
//	}
//
//	
//	public boolean esPotacio(Componente componente) {
//		return (componente.getDescripcion().indexOf(Constantes.Componentes.POTASIO)>=0);
//	}

	
//	public boolean esSodio(Componente componente) {
//		return (componente.getDescripcion().indexOf(ConstantesDTO.Componentes.SODIO)>=0);
//	}
//
//	
//	public boolean esBalanceAnionicoCationico(Componente componente) {
//		return (componente.getId() == ConstantesDTO.Componentes.BALANCECATIONICO_CODIGO);
//	}
//
//	
//	public boolean esBalanceElectrolitico(Componente componente) {
//		return (componente.getId() == ConstantesDTO.Componentes.BALANCEELECTROLITICO_CODIGO);
//	}

	
	public Componente getComponenteByNombre(String nombre) {
		List<Componente> lista = null;
		Componente componente = null;
		StringBuilder queryString = new StringBuilder();

		//Si el id del grupo que viene como parametro es Facyt, se deben mostrar TODAS las mp. de la base
		//buscar las materias primas del usuario 1 Facyt mas las del usuarios idusuario.
		queryString.append("FROM Componente c where c.descripcion = :descrip");	
			

		try {
			// se crea la cuery
			Query query = this.entityManager
					.createQuery(queryString.toString());		
			query.setParameter("descrip", nombre.trim());
			
			lista = (List<Componente>) query.getResultList();			
						
			if (!lista.isEmpty())
				componente = lista.get(0);
		} catch (Exception e) {
			logger.error("",e);
			return null;
		}

		return componente;
	}
	
	
	public Componente getComponenteById(long id) {		
		List<Componente> lista = null;
		Componente componente = null;
		StringBuilder queryString = new StringBuilder();

		//Si el id del grupo que viene como parametro es Facyt, se deben mostrar TODAS las mp. de la base
		// buscar las materias primas del usuario 1 Facyt mas las del usuarios idusuario.
		queryString.append("FROM Componente c where c.id = :codigo");	
			

		try {
			// se crea la cuery
			Query query = this.entityManager
					.createQuery(queryString.toString());		
			query.setParameter("codigo", id);
			
			lista = (List<Componente>) query.getResultList();			
			
			if (!lista.isEmpty())
				componente = lista.get(0);
			
		} catch (Exception e) {
			logger.error("", e);
			return null;
		}

		return componente;
	}

	
//	public boolean esCalcio(Componente componente) {
//		return (componente.getDescripcion().indexOf(ConstantesDTO.Componentes.CALCIO)>=0);
//		
//	}
	
	
	public String toString(Componente componente){	
		if(componente.getId() > 0)
			return componente.getId()+" - "+componente.getDescripcion();
		else
			return componente.getDescripcion();
	
	}

	
	public String getCantidadToReporte(Componente componente, BigDecimal float1,
			boolean bool) {
		Unidad u = componente.getUnidad();
		if(u!=null)
			return getCantidadToReporte(u,float1, bool);
		else
		{
			String valor = "";
			try {
	            //valor = new Float(StringUtils.roundNum(float1.floatValue(), valorDecimal));
	        	//valor = new Float(StringUtils.truncNum(float1.floatValue(), 3));
	        	valor = StringUtils.getSimela2decimales(float1.toString());
	        } catch (Exception e) {
	            // TODO Auto-generated catch block
	            valor =float1.toString();
	        }
	        
	        return valor;
		}
	}

	private String getCantidadToReporte(Unidad u, BigDecimal float1, boolean bool) {
		String valor;
		if(bool)
		{		
	        try {
	            //valor = new Float(StringUtils.roundNum(float1.floatValue(), valorDecimal));
	        	//valor = new Float(StringUtils.truncNum(float1.floatValue(), 3));
	        	valor = StringUtils.getSimela2decimales(float1.toString());
	        } catch (Exception e) {
	            // TODO Auto-generated catch block
	            valor =float1.toString();
	        }
	        //valor = new Float(float1.floatValue()* unidadInt);
		}else
			valor = StringUtils.getSimela2decimales(float1.toString());
		
		return valor+" "+u.getDescripcion();
	}

	public boolean esCloro(Componente componente) {
		// TODO Auto-generated method stub
		return false;
	}

	public boolean esAzufre(Componente componente) {
		// TODO Auto-generated method stub
		return false;
	}

	public boolean esPotacio(Componente componente) {
		// TODO Auto-generated method stub
		return false;
	}

	public boolean esSodio(Componente componente) {
		// TODO Auto-generated method stub
		return false;
	}

	public boolean esBalanceAnionicoCationico(Componente componente) {
		// TODO Auto-generated method stub
		return false;
	}

	public boolean esBalanceElectrolitico(Componente componente) {
		// TODO Auto-generated method stub
		return false;
	}

	public boolean esCalcio(Componente componenteById1) {
		// TODO Auto-generated method stub
		return false;
	}

	
}
